<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // Reflect 就是将 Object上的一些静态方法给迁移到了一个对象上 直接使用这个对象调用的方法可以达到同样的效果
    // Reflect 是一个对象 类似于 Match对象的存在 Objcet是一个构造函数 这一点要记清楚咯

    // Reflect的好处：
    // 1.使代理对象中，可以不直接操作原对象
    // 2.使用Reflect的方法会返回一个boolean值，用于判断操作是否成功
    // 3. recejver 就是外层所创建的代理对象   Reflect的set/get的最后一个参数receiver 可以决定对象访问器中setter/getter的this指向
    // 原来的this是指向原对象的，如果传入receiver那么就会指向当前所创建的代理对象

    // Reflect he Proxy一起使用的好处
    // 1.可以不直接操作原对象
    // 2.使用Reflect上的方法有返回值，可以判断操作是否执行成功
    // 3.传入最后一个参数receiver可以修改对象访问器属性getter/setter中的this指向z

    let obj = {
      name: 'lll',
      age: 18
    }

    let objProxy = new Proxy(obj, {
      set: function (target, key, newValue, receiver) {
        // 之前使用  target[key] = newValue 还是会直接操作原对象
        // 现在使用Reflect就可以不直接操作原对象
        let isSuccess = Reflect.set(target, key, newValue, receiver)
        if (!isSuccess) {
          throw new Error(`set${key}fail`)
        }
      },
      get: function (target, key, receiver) {
        let isSuccess = Reflect.get(target, key, receiver)
        if (!isSuccess) {
          throw new Error(`set${key}fail`)
        }
      }
    })
    objProxy.name = '123'
    console.log(obj.name);
  </script>
</body>

</html>